/*
	为LRU添加锁，封装
*/

package geecache

import (
	"geecache/lru"
	"sync"
)

type cache struct {
	mu        sync.Mutex
	lru       *lru.Cache
	cacheSize int64 // cache最大缓存值，对应lru中的maxSize
}

// 添加方法
// 在这一层封装中，value变为ByteView型
func (c *cache) add(key string, value ByteView) {
	// 加锁
	c.mu.Lock()
	defer c.mu.Unlock()

	// 判断cache中lru是否存在
	// 不存在则新建
	// 实现写时创建
	if c.lru == nil {
		c.lru = lru.New(c.cacheSize, nil)
	}

	// 调用lru中的Add方法
	c.lru.Add(key, value)
}

// 获取方法
func (c *cache) get(key string) (value ByteView, ok bool) {
	// 加锁
	c.mu.Lock()
	defer c.mu.Unlock()

	// 判断cache中lru是否存在，不存在则直接返回
	if c.lru == nil {
		return
	}

	// 存在则调用lru中的Get方法
	if v, ok := c.lru.Get(key); ok {
		return v.(ByteView), ok
	}

	return
}
